/**
 * 应用主类
 * 负责应用的整体初始化和协调
 */
class App {
  constructor() {
    this.appState = new AppState();
    this.globalEventHandlers = new GlobalEventHandlers(this.appState);
    this.pageLoader = window.pageLoader;
    this.pageManager = null;
    this.pageHandlers = new Map();
  }

  async init() {
    // 等待 DOM 加载完成
    if (document.readyState === "loading") {
      document.addEventListener("DOMContentLoaded", () => this.setup());
    } else {
      this.setup();
    }
  }

  async setup() {
    try {
      console.log("[App] 开始初始化...");

      // 初始化状态管理器
      window.stateManager.loadFromStorage();
      console.log("[App] 状态管理器初始化完成");

      // 初始化页面管理器
      this.pageManager = new PageManager(this.pageLoader, window.eventManager);
      console.log("[App] 页面管理器初始化完成");

      // 初始化页面加载器
      await this.pageLoader.init();
      console.log("[App] 页面加载器初始化完成");

      // 初始化页面处理器
      await this.initializePageHandlers();
      console.log("[App] 页面处理器初始化完成");

      // 初始化全局事件处理器
      this.globalEventHandlers.init();
      console.log("[App] 全局事件处理器初始化完成");

      // 初始化应用状态
      await this.appState.init();
      console.log("[App] 应用状态初始化完成");

      // 检测 Claude Code 状态并决定显示哪个页面
      await this.detectAndShowInitialPage();
      console.log("[App] 初始页面检测完成");

      // 更新版本信息
      await this.updateVersionInfo();
      console.log("[App] 版本信息更新完成");

      // 设置全局导航函数
      this.setupGlobalNavigation();
      console.log("[App] 全局导航设置完成");

      console.log("[App] 应用初始化完成");
    } catch (error) {
      console.error("[App] 应用初始化失败:", error);
    }
  }

  /**
   * 初始化页面处理器
   */
  async initializePageHandlers() {
    // 创建页面处理器实例
    const homeHandler = new HomeHandler(
      this.appState,
      window.apiService,
      window.UIUtils
    );
    const setupHandler = new SetupHandler(
      this.appState,
      window.apiService,
      window.UIUtils
    );
    const tasksHandler = new TasksHandler(
      this.appState,
      window.apiService,
      window.UIUtils
    );
    const historyHandler = new HistoryHandler(
      this.appState,
      window.apiService,
      window.UIUtils
    );

    // 注册页面处理器
    this.pageLoader.registerPageHandler("home", homeHandler);
    this.pageLoader.registerPageHandler("setup", setupHandler);
    this.pageLoader.registerPageHandler("tasks", tasksHandler);
    this.pageLoader.registerPageHandler("history", historyHandler);

    // 保存处理器引用
    this.pageHandlers.set("home", homeHandler);
    this.pageHandlers.set("setup", setupHandler);
    this.pageHandlers.set("tasks", tasksHandler);
    this.pageHandlers.set("history", historyHandler);

    // 设置全局引用，供HTML中的onclick事件调用
    window.homeHandler = homeHandler;
    window.setupHandler = setupHandler;
    window.tasksHandler = tasksHandler;
    window.historyHandler = historyHandler;

    console.log("[App] 页面处理器注册完成");
  }

  async detectAndShowInitialPage() {
    try {
      console.log("[App] 开始检测 Claude Code 状态...");

      // 检查 Claude Code 是否已安装
      const claudeResult = await window.apiService.checkClaudeCode();
      console.log("[App] Claude Code 检测结果:", claudeResult);

      // 直接显示首页，内置版本会自动处理
      console.log("[App] 显示首页");
      await this.pageManager.switchToPage("home");

      console.log("[App] 初始页面显示完成");
    } catch (error) {
      console.error("[App] 检测 Claude Code 状态失败:", error);
      // 出错时默认显示首页
      await this.pageManager.switchToPage("home");
    }
  }

  async updateVersionInfo() {
    const versionElement = document.getElementById("header-claude-version");
    
    try {
      console.log("[App] 开始更新版本信息...");

      // 获取 Claude Code 版本
      const claudeVersionResult =
        await window.apiService.getClaudeCodeVersion();
      console.log("[App] Claude Code 版本检测结果:", JSON.stringify(claudeVersionResult, null, 2));

      // 更新页面上的版本显示
      if (versionElement) {
        if (claudeVersionResult.success && claudeVersionResult.version) {
          // 正确解析版本信息 - 处理嵌套结构
          let version = "未知版本";

          // 处理嵌套的版本结构
          if (
            claudeVersionResult.version.success &&
            claudeVersionResult.version.version
          ) {
            if (typeof claudeVersionResult.version.version === "string") {
              version = claudeVersionResult.version.version;
            } else if (
              claudeVersionResult.version.version.success &&
              claudeVersionResult.version.version.version
            ) {
              version = claudeVersionResult.version.version.version;
            }
          } else if (typeof claudeVersionResult.version === "string") {
            version = claudeVersionResult.version;
          }

          console.log("[App] 解析后的版本:", version);
          versionElement.textContent = version;
          versionElement.style.color = "#22c55e"; // 绿色表示成功
        } else {
          console.warn("[App] 版本检测失败，显示'未检测到'");
          versionElement.textContent = "未检测到";
          versionElement.style.color = "#ef4444"; // 红色表示失败
        }
      } else {
        console.error("[App] 找不到版本显示元素 #header-claude-version");
      }

      console.log("[App] 版本信息更新完成");
    } catch (error) {
      console.error("[App] 更新版本信息异常:", error);

      // 出错时显示错误状态
      if (versionElement) {
        versionElement.textContent = "检测失败";
        versionElement.style.color = "#ef4444";
      }
    }
  }

  /**
   * 设置全局导航函数
   */
  setupGlobalNavigation() {
    // 设置全局的页面切换函数
    window.switchTab = (tabId) => {
      this.pageManager.switchToPage(tabId);
    };

    // 设置全局的返回函数
    window.goBack = () => {
      this.pageManager.goBack();
    };

    console.log("[App] 全局导航函数设置完成");
  }

  /**
   * 获取当前页面处理器
   * @param {string} pageId - 页面ID
   */
  getPageHandler(pageId) {
    return this.pageHandlers.get(pageId);
  }

  /**
   * 获取当前页面
   */
  getCurrentPage() {
    return this.pageManager ? this.pageManager.getCurrentPage() : null;
  }

  /**
   * 清理应用资源
   */
  cleanup() {
    // 清理页面处理器
    this.pageHandlers.forEach((handler, pageId) => {
      if (handler && typeof handler.cleanup === "function") {
        handler.cleanup();
      }
    });
    this.pageHandlers.clear();

    // 清理页面加载器
    if (this.pageLoader) {
      this.pageLoader.cleanup();
    }

    // 清理事件管理器
    if (window.eventManager) {
      window.eventManager.clear();
    }

    console.log("[App] 应用资源清理完成");
  }
}

// 导出到全局
window.App = App;
